package de.hsb.ai.agent.misterx.brain.history;

import game.Move;
import jade.core.AID;
import java.awt.geom.Point2D;
import java.util.AbstractMap;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import de.hsb.ai.domain.GameStarted;
import de.hsb.ai.domain.MoveEvent;


public class HistoryCapturer {

	private Map<AID, MoveHistory> _entry = new HashMap<AID, MoveHistory>();
	
	public HistoryCapturer() {
		
	}
	
	/**
	 * initialisiert die History mit den Spielern.
	 * @param g
	 */
	public void handleGameStarted(GameStarted g) {
		List<AID> players = g.getInfo().getPlayers();
		for(AID player : players) {
			this._entry.put(player, new MoveHistory());
		}
	}
	
	/**
	 * loggt den Verlauf des Spiels von jedem Spieler mit.
	 * @param m
	 */
	public void handleMove(MoveEvent m) {
		Move move = m.getMove();
		if(move != null) {
			MoveHistory moveHistory = this._entry.get(m.getPlayer());
			moveHistory.addMove(m.getMove());
		}
		
		
	}
	
//--------------------------------------------------------------------
// FUNKTIONEN
//--------------------------------------------------------------------
	
	/**
	 * gibt die History eines Spielers zurück.
	 * @param player
	 * @return
	 */
	public MoveHistory getHistory(AID player) {
		return this._entry.get(player);
	}

	/**
	 * Iterator um an die AID der Spieler zu gelangen.
	 */
	
	public Set<Entry<AID, MoveHistory>> getMoveHistory() {
		return this._entry.entrySet();
	}
	
	/**
	 * gibt den letzen Move (derzeitige Position) eines Spielers zurück.
	 * @param player
	 * @return
	 */
	public Move getLastPlayerMove(AID player) {
		MoveHistory moveHistory = this._entry.get(player);
		if(moveHistory != null) {
			return moveHistory.getLastMove();
		}
		return null;
	}
	
	/**
	 * gibt die letzte bekannte Bewegunsrichtung eines Spielers zurück.
	 * @param player
	 * @return
	 */
	public Point2D getLastPlayerMoveDirection(AID player) {
		MoveHistory moveHistory = this._entry.get(player);
		if(moveHistory != null) {
			return moveHistory.getLastMovingDirection();
		}
		return null;
	}
	
	/**
	 * gibt den letzten Move(derzeitige Position) aller Spieler zurück.
	 */
	public Set<Entry<AID, Move>> getLastPlayerMoves() {
		Set<Entry<AID, Move>> lastMoves = new HashSet<Entry<AID, Move>>();
		
		for(AID aid : this._entry.keySet()) {
			MoveHistory movehistory = this._entry.get(aid);
			lastMoves.add(new AbstractMap.SimpleEntry<AID, Move>(aid, movehistory.getLastMove()));
	    }

		return lastMoves;
	}
	
	/**
	 * gibt die verbrauchten Tickets eines Spielers zurück.
	 * @param player
	 * @return
	 */
	public Map<Integer, Integer> getSpentTickets(AID player) {
		return _entry.get(player).getSpentTickets();
	}
	
	
}
